import Vue from 'vue';
import {
    setLike,
} from '@/lib/utils';

export default class SpecManage {
    constructor(options) {
        this.options = Object.assign({
            minQuantity: 1,
        }, options);
        this.map = {};
        /** 允许连接逻辑 */
        this.lineMap = {};
        /** 当所有的规格都存在选中时，并且key的顺序一定情况下 */
        this.specMap = {};
        /** 所有规格列表 */
        this.meta = [];
        this.metaMap = {};
        /** 所选择的规格 */
        this.selected = {};
    }

    /**
     * 生成规格原始信息
     * @param specKey 代表规格类型
     * @param name 规格名
     * @param list 所有规格
     */
    addMeta(specKey, name, list) {
        const self = this;
        if (self.metaMap[specKey] >= 0) {
            return;
        }

        self.metaMap[specKey] = self.meta.length;
        self.meta.push({
            key: specKey,
            name,
            list: setLike(list || []),
        });

        // todo: 考虑是否有必要
        if (list) {
            list.forEach((specName) => {
                if (!self.map[specKey][specName]) {
                    self.map[specKey][specName] = {
                        quantity: 0,
                        enable: true,
                    };
                }
            });
        }

        // tip: 帮助vue建立可观测的对象
        Vue.set(this.selected, specKey, null);
        // this.selected[specKey] = null;
    }
    /**
     * 为规格添加库存
     * @param specKey 规格key
     * @param specName 规格
     * @param quantity 数量
     */
    addSpecQuantity(specKey, specName, quantity) {
        const map = this.map;
        if (!map[specKey]) {
            map[specKey] = {};
        }
        if (!map[specKey][specName]) {
            map[specKey][specName] = {
                quantity: quantity || 0,
                enable: true,
            };
        } else {
            map[specKey][specName].quantity += quantity;
        }
    }
    /**
     * 建立line
     */
    buildLine(item) {
        const keys = this.meta.map((item) => item.key);
        const l = keys.length;
        for (let x = 0; x < l; x++) {
            for (let y = 0; y < l; y++) {
                if (x === y) {
                    continue;
                }
                const key = item[keys[x]] + '_' + item[keys[y]];
                // 根据quantity来创建spec
                if (item.quantity >= this.options.minQuantity) {
                    this.lineMap[key] = true;
                }
            }
        }
    }
    /**
     * 保存在specMap中
     * @param spec 规格数据
     */
    storeSpecMap(spec) {
        const keys = this.meta.map((item) => item.key);
        // @ts-ignore
        this.specMap[keys.map((key) => spec.param[key]).join('_')] = spec;
    }
    /**
     * 开启/关闭规格
     * @param key 规格key
     * @param spec 规格内容
     */
    toggleSpec(key, spec) {
        // toggle规格
        Vue.set(this.selected, key, this.selected[key] === spec ? null : spec);
        // this.selected[key] = this.selected[key] === spec ? null : spec;
        this.refreshSpec();
    }
    /**
     * 刷新规格信息
     */
    refreshSpec() {
        const metaList = this.meta;
        const lineMap = this.lineMap;
        // tip: 不使用isUndef，是为了不引入lib/utils，因为引入会导致单元测试失败
        const selectedEntries = Object.entries(this.selected).filter((item) => (item[1] !== null && item[1] !== undefined));

        // 没有选中，全部重置
        for (const meta of metaList) {
            for (const spec of meta.list) {
                let enable = true;
                for (const [ sKey, sSpec ] of selectedEntries) {
                    // 同key不检查
                    if (meta.key === sKey) {
                        continue;
                    }
                    enable = enable && !!lineMap[spec + '_' + sSpec];
                }
                this.map[meta.key][spec].enable = enable;
            }
        }
    }
    /**
     * 使用spec数据
     */
    select(spec) {
        this.meta.forEach((meta) => {
            this.selected[meta.key] = spec[meta.key];
        });
    }
    /**
     * 重置选择的内容
     */
    resetSelected() {
        this.meta.forEach((meta) => {
            this.selected[meta.key] = null;
        });
    }
    /**
     * 获取选中的规格信息
     */
    getSelectedSpecification() {
        const keys = this.meta.map((item) => item.key);
        return this.specMap[keys.map((key) => this.selected[key]).join('_')];
    }
}
